程序输入源和输出目标统称为设备(device)。无论什么设备,是用于输入还是输出,C语言都通过流进行输入和输出操作。

流与文件息息相关。这里的文件指的不是磁盘文件,而是程序待处理的流和实际物理设备之间的媒介。大多数情况下,C语言的初学者无需了解这些文件,因为流、文件、设备之间的交互都由C库函数和操作系统自动完成。

C语言的流有两种模式:文本模式和二进制模式。文本流只由字符组成,如发送至屏幕的文本数据。文本流被组织成行,每行最多可255个字符,且以行结束符或换行符结尾。文本流中的某些字符(如换行符)有特殊的含义。

C标准库中有许多用于处理输入流和输出流的函数。如Printf(),puts(),gets(),scanf()等;

C语言fputs()函数:写文件函数(将一指定的字符串写入文件)

#include <stdio.h>

int fputs(const char * s, FILE * stream);

函数说明:fputs()用来将参数s 所指的字符串写入到参数stream 所指的文件内。

返回值:若成功则返回写出的字符个数, 返回EOF 则表示有错误发生.

ASCII文件和二进制文件有什么不同?

ASCII文件是将存储在文件中的每个字节解释成一个ASCII字符,二进制文件是将文件内容解释成一个二进制的比特流,由程序解释这些比特流的意义。

既然程序执行结束系统会关闭所有打开的文件,为什么程序中还要用close关闭文件?

在有些大系统中,某些文件会被反覆地打开或同时打开。如果某次打开后没有关闭可能会使某些文件操作的结果不正确。

fread(sendbuff,sizeof(char),1024,filehandle);

fread读取数据块,在读数据时它不会碰到'\0'就停止,而是把'\0'一起读入sendbuff中,一直读满1024个char个字节才停止,所以你数据不够这么长的的话,就肯定会有乱码,fread不是读取一行,而是读取一块数据

printf("格式控制串","输出项列表")

格式控制串包括1 普通字符:原样输出;2 转义字符,以"\"开头; 3 格式说明符,以"%"开头,控制数据输出格式。

在用scanf()函数传参时,数值和字符类型变量之前要使用取地址符&,而字符串变量则不需要,因为其变量名本身就代表内存地址。

缓冲输入,将若干内容先存储到称为缓冲区(buffer)的临时存储区域,等待适当时机将缓冲区内的内容变得对程序可用,非缓冲输入是不使用缓冲区,直接让输入对程序可用。缓冲输入对于频繁读写有更高的效率,而非缓冲输入是即时交互程序所需要的

filelength函数用于获取文件的长度,但是最大只能获取2g的文件大小,因为返回值类型long使用4个字节大小来表示,最大为2的31次方也就是2G的大小。

long filelength(int _FileHandle);

_FileHandle:文件的句柄。

返回值:文件的大小,单位为字节。

FILE* file=fopen("test.txt","r");

int iSize=filelength(fileno(file));

fclose(file);

void *malloc(unsigned int num_bytes);

printf能输出string型的变量吗

string是类,printf()只能打印基本类型。

string s;

cout << s;

printf("%s", s.c_str()); //不推荐

putc(); 字符
fscanf(); 字词,遇到空格和换行时结束
puts(); 串、行
fputs(); 串、行,比puts()安全,是puts()的替代函数

C++写写入文件
fstream file("test.txt",ios::out);
file<"2 sex:"<endl;

对文件操作的顺序:打开文件→读写文件→关闭文件。打开文件是指将文件从磁盘调入内存,并与文件操作指针建立关联。文件使用结束应及时关闭,以免丢失信息,关闭文件的同时也是存盘的过程。

fgets(str,n,fp)的功能是:从fp所指向的文件中读取长度不超过n-1的字符串存入str开始的内存。

若在取字符过程中遇到行结束标志\n或文件结束标志EOF,则读取操作自动结束。取出的字符数可以少于n-1个。取字符结束后自动在末尾加上字符串结束标志\0。

feof(fp)测试文件是否结束,返回1或0.

c语言在文件中存取数据有两种方式:顺序读写和随机读写,即可以通过一般的读写操作函数进行顺序存取,又可以通过函数fseek(fp,位移量,起始点)对文件中的位置指针进行定位,再用读写操作函数进行存取,即实现随机存取。

fputs(p1,p2)从p1开始的内存中读取一个字符串存入p2指向的文件;

fread(buffer,size,cout,fp)从文件指针fp指向的文件中读取count个size大小的数据存入内存buffer开始的单元。

printf("exp",var1,var2,……);

exp:格式字符串;

exp:字符,\,%

%引导转换说明:conversion specification

scanf("exp",&var,&var2……);

exp:%;

fopen()打开一个文件并且创建一个用于存储文件和缓冲区信息的结果,返回指向该结构的指针。

fclose()关闭文件并刷新缓冲区;

C程序把输入看作是字节流,输入流来源于文件,输入设备(如键盘)或者甚至是另一个程序的输出;

typedef struct {
  short             level;      /* fill/empty level of buffer */
  unsigned          flags;      /* File status flags */
  char              fd;         /* File descriptor */
  unsigned char     hold;       /* Ungetc char if no buffer */
  short             bsize;      /* Buffer size */
  unsigned char     *buffer;    /* Data transfer buffer */
  unsigned char     *curp;      /* Current active pointer */
  unsigned          istemp;     /* Temporary file indicator */
  short             token;      /* Used for validity checking */
}  FILE;                        /* This is the FILE object */

scanf用lf%代表double,用f%代表float;

C语言操作文件时会在内存中开辟一块缓冲操作区。

文件指针FILE *fp,FILE是一个结构。

gets(字符数组)

从终端接受一个包含任意字符的字符串,直到遇到回车。

puts(字符数组)

将一个字符串(以‘\0’结束的字符序列)输出到终端

文本文件在读入内存时先转换为二进制文件,在地直接在屏幕上显示字符,因此便于阅读和逐个字符打印。

二进制文件在读写数据时不需要转换,但显示在屏幕上时需要先转换为ASCII码再显示。

一旦建立了一个流,将它与文件相关联的一种方法是使用函数open()。

文件结束符EOF为-1.

打开文件是指将文件指针与某一外存中的文件关联起来,半为文件的读写做好准备,例如为文件准备缓冲区,记录读写位置等。

C语言程序不能直接访问外存储器中的文件,文件访问通过一个FILE类型的结构体变量做为中介。打开文件是让文件和这个结构体变量关联起来,以后通过这个结构体变量访问对应的文件。

程序不能直接访问外存中的信息,文件访问是通过缓冲区实现的,每个打开的文件在内存中都有一块对应的缓冲区,程序对文件的读写是对这块缓冲区的读写。缓冲区与文件的信息交互由系统自动完成,不需要程序的介入。

程序访问文件时,必须知道对应的缓冲区在什么地方,缓冲区是空的还是满的,当前读写的信息处于文件中的什么位置等信息。C语言将这些信息定义成一个称为FILE的结构体基本类型,每个访问的文件都有一个对应的FILE类型的变量。当程序需要访问某个文件时,必须定义一个对应这个文件的指针,打开文件时,会创建一个保存该文件信息的FILE类型的变量,并返回指向该变量的指向,这个指针称为文件指针。

文件定位指针记录文件中当前读写位置,是一个long int类型的变量,表示将要读写的数据是文件中的第几个字节,当程序读写文件时,系统根据文件定位指针的值把信息写入文件的指定位置。

fopen()函数不仅打开一个文件,还创建一个缓冲区(在读写模式下创建两个缓冲区)以及一个包含文件和缓冲区数据的结构。另外,fopen()返回一个指向该结构的指针,以便其他函数知道如何找到该结构。假设把该指针赋给一个指针变量fp,我们说fopen()函数“打开一个流”。如果以文本模式打开该文件,就获得一个文本流,如果以二进制模式打开该文件,就获得一个二进制流。

这个结构通常包含一个指定流中当前位置的文件指示器。除此之外,它还包含错误和文件结尾的指示器、一个指向缓冲区开始处的指针、一个文件标识符和一个计数(统计实际拷贝进缓冲区的字节数)。

fgets()+fputs():字符串方式读写,末尾会添加\n;

fscanf()+fprintf():格式化读写,可以为内容添加\t等控制字符,形成表格数据;

fread()+fwrite():字节流读写,如读写结构体数据;

feof():判断是否到达文件的结尾;

EOF,对于文本文件,数据以字符的ASCII码值的形式存放,普通字符的ASCII码的范围是32到127(十进制),EOF的16进制代码为0XFF(十进制为-1),因此可以用EOF作为文件的结束标志。当把数据以二进制的形式存入到文件中时,就有可能会将数字-1存入到文件中,此时继续根据EOF来判断文件是否结束就会出问题,为了解决这个问题,ASCI C就提供了foef函数。

fgetc()等函数会设置EOF。当读到文件末尾时。

scanf()函数之所以要求指针作为参数,最主要的原因是希望通过调用这个函数来改变main()函数本地的变量i的值。

用puts(str)代替printf("%s",str)

用putchar('\n')代替printf("\n");

用“a”方式打开文件并不要求文件事先存在,如果文件不存在不会得到出错信息,因为“a”的含义是打开或创建一个新文件。如果文件存在则向文件末尾写入新数据;如果文件不存在,则创建一个新文件,这时“a”和“w”没有什么区别。

在scanf()函数调用时,控制字符串中的一个空白字符(“ ”、“\n”或“\t”)指令(directive),可以匹配无穷多个连续的空白字符序列。在scanf()函数调用时,通常也不应该出现空白字符指令,尤其是在控制字符串的结尾更不应该。scanf("%f%f",&a,&b);默认就是按空格字符去区隔的,不管%f%f之间有没有空格,或有多个空格。

stdin 是一个指向FILE 类型对象的指针类型的表达式。

在很多实现中,它其实是一个“常量”表达式。例如在Visual C++中,stdin 是这样定义的:

#define stdin (&_iob[0])

格式输出函数

函数作用:向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。

一般格式:printf(格式控制,输出表列)

s格式符输出字符串.

① %s例如:

printf("%s","china")

输出字符串“china”(不包括双引号)。

② %ms,输出的字符串占m列,若串长大于m,则全部输出,若串长小于m,则左补空格。

③ %-ms,若串长小于m,字符串向左靠,右补空格。

④ %m. ns,输出占m列,只取字符串中左端n个字符,输出在m列的右侧,左补空格。

⑤ %-m.ns,n个字符输出在m列的左侧,右补空格,若n〉m,m自动取n值。

printf(“%3s,%7.2s,%.4s,%-5.3s\n”, “china”, “china”, “china”, “china”);

其底层是通过一个循环分析"format"的每一个字符,对字符%及其后的每一个字符进行分析,对应variable list分别进行构建字符串。

通俗地说,fgets将输入流中由调用起,stdin输入的东西存入起始地址为tran_to_int的地方,并且最多读取sizeof(tran_to_int)个,并在后方sscanf函数中将刚才读入的数据按照%d的格式存入stay_here,这就是C语言一直在强调的流概念的意义所在,这两个语句组合看起来也就是读取一个数据这么简单,但是我们要知道一个问题,一个关于scanf的问题

scanf("%d", &stay_here);

这个语句将会读取键盘输入,直到回车之前的所有数据,什么意思?就是回车会留在输入流中,被下一个输入读取或者丢弃。这就有可能会影响我们的程序,产生意料之外的结果。而使用上当两句组合则不会。

预定义指针到设备文件(键盘或显示器)的FILE常量

指向FILE常量的指针:设备文件

stdin:键盘

stdout:显示器

stderr:显示器

m=fgetc(stdin); 从指向FILE常量stdin(即键盘)的指针指定的文件中读取一个字符,并返回其ASCII值,该值赋值给m。

fputc(m,stdout);将字符(其ASCII值存储在m中)写入由FILE常量stdout指针指定的文件(显示器)。

系统在主存中开辟一个专用的内存区域用来临时存放输入/输出信息,这种内存区域称为缓冲区。输入/输出流可以是缓冲的,也可以是非缓冲的。引入缓冲的目的是为了提高系统的效率。通常情况使用缓冲流。(FILE一般使用缓冲区)

The first argument to printf is always a format string. The format string provides a template for the string to be printed, and it contains any number of special format specifiers. Format specifiers tell printf how to interpret and format the arguments following the format string. All format specifiers begin with %.

For example, the format specifier for an int is %d. Whenever printf sees a %d in the format string, it knows to expect an int argument following the format specifier. Then printf replaces the format specifier with the argument’s actual value.

文件打开时,系统给文件分配一个位置指针,用于指向文件当前的读写位置。每次读取字符,文件的位置指针便会自动向下移动读取数量的字节,不需要人为进行控制。这种功能在许多读写函数中都会有体现。

fgetc()当读到文件末尾的空字符时,返回EOF,并设置EOF。

while ((c = fgetc(fp)) != EOF) {

feof()用于检测EOF,以下代码用于检测EOF,如果在循环体内用fgetc(),则有一个字符的区别。

while (!feof(fp)) {

The program could read one character from the file, process it, read the next character from the file, and so on. Reading a file a character at a time from a disk requires a lot of hardware activity and is slow. The buffered approach is to read a large chunk from the disk, store the chunk in the buffer, and read the buffer one character at a time. Because it is much quicker to read individual bytes of data from memory than from a had disk, this approach is much faster as well as easier on the hardware. Similarly, in output, a program can first fill the buffer and then transfer the entire block of data to a hard disk, clearing the buffer for the next batch of output. This is called flushing the buffer.

input

The cin is to use whitespace-spaces, tabs, and newlines- to delineate a string. This means cin reads just one word when it gets input for a character array.

After it reads this word, cin automatically adds the terminating null character when it places the string into the array.

To be able to enter whole phrases instead of single words as a string, you can use some line-oriented class member functions: getline() and get(). getline() discards the newline character, whereas get() leaves it in the input queue.

A buffer is a block of memory where data is accumulated before being physically read or written to the associated file or device. Streams can be either fully buffered, line buffered or unbuffered. On fully buffered streams, data is read/written when the buffer is filled, on line buffered streams this happens when a new-line character is encountered, and on unbuffered streams characters are intended to be read/written as soon as possible.

Streams have certain internal indicators that specify their current state and which affect the behavior of some input and output operations performed on them:

Error indicator

This indicator is set when an error has occurred in an operation related to the stream. This indicator can be checked with the ferror function, and can be reset by calling either to clearerr, freopen or rewind.

End-Of-File indicator

When set, indicates that the last reading or writing operation performed with the stream reached the End of File. It can be checked with the feof function, and can be reset by calling either to clearerr or freopen or by calling to any repositioning function (rewind, fseek and fsetpos), or by calling of fgetc().

Position indicator

It is an internal pointer of each stream which points to the next character to be read or written in the next I/O operation. Its value can be obtained by the ftell and fgetpos functions, and can be changed using the repositioning functions rewind, fseek and fsetpos.

A stream buffer is an object in charge of performing the reading and writing operations of the stream object it is associated with: the stream delegates all such operations to its associated stream buffer object, which is an intermediary between the stream and its controlled input and output sequences.

All stream objects, no matter whether buffered or unbuffered, have an associated stream buffer: Some stream buffer types may then be set to either use an intermediate buffer or not.

I/O streams are objects of type FILE that can only be accessed and manipulated through pointers of type FILE* (Note: while it may be possible to create a local object of type FILE by dereferencing and copying a valid FILE*, using the address of such copy in the I/O functions is undefined behavior). Each stream is associated with an external physical device (file, standard input stream, printer, serial port, etc).

I/O streams can be used for both unformatted and formatted input and output. They are locale-sensitive and may perform wide/multibyte conversions as necessary. All streams access the same locale object: the one most recently installed with setlocale.

Besides the system-specific information necessary to access the device (e.g. a POSIX file descriptor), each stream object holds the following:

1) (C95) Character width: unset, narrow, or wide

2) Buffering state: unbuffered, line-buffered, fully buffered.

3) The buffer, which may be replaced by an external, user-provided buffer.

4) I/O mode: input, output, or update (both input and output).

5) Binary/text mode indicator.

6) End-of-file status indicator.

7) Error status indicator.

8) File position indicator (an object of type fpos_t), which, for wide character streams, includes the parse state (an object of type mbstate_t(C95)).

9) (C11) Reentrant lock used to prevent data races when multiple threads read, write, position, or query the position of a stream.

stdin expression of type FILE* associated with the input stream

stdout expression of type FILE* associated with the output stream

stderr expression of type FILE* associated with the error output stream

fgetc()+fputc():字符方式读写;